#include <stdio.h>
#include "ov9655.h"
#include "dvp.h"
#include "plic.h"
#include "dvp_cam.h"
#include "pin_config.h"
#include "st7789.h"
#include "sysctl.h"
#include "unistd.h"
#include "fpioa.h"

#define LEN 148
/*320x240 */
const uint8_t ov9655_config[LEN][2]=
{
  {0x12, 0x80},
  {0x00, 0x00},
  {0x01, 0x80},
  {0x02, 0x80},
  {0x03, 0x02},
  {0x04, 0x00},
  {0x09, 0x03},
  {0x0b, 0x57},
  {0x0c, 0x04},
  {0x0e, 0x61},
  {0x0f, 0xc2},//C2
  {0x11, 0x04},//内部时钟分频 10
  {0x12, 0x63},
  {0x13, 0xe7},//关闭带状滤波器
  {0x14, 0x6a}, //3a
  {0x16, 0x24},
  {0x17, 0x18},
  {0x18, 0x04},
  {0x19, 0x01},
  {0x1a, 0x81},
  {0x1e, 0x00},//开启倒影 ----
  {0x24, 0x3c},
  {0x25, 0x36},
  {0x26, 0x72},
  {0x27, 0x08},
  {0x28, 0x08},
  {0x29, 0x15},
  {0x2a, 0x00},
  {0x2b, 0x00},
  {0x2c, 0x08},
  {0x32, 0x24},// 12/24
  {0x33, 0x00},
  {0x34, 0x3f},// 3f
  {0x35, 0x00},
  {0x36, 0x3a},// 3a
  {0x38, 0x72},
  {0x39, 0x57},
  {0x3a, 0x04},//CA
  {0x3b, 0x04},
  {0x3d, 0x99},
  {0x3e, 0x0E},
  {0x3f, 0xc1},
  {0x40, 0xd0},//d0 \正常的RGB模式，565，555改这寄存器
  {0x41, 0x01},
  {0x42, 0xc0},
  {0x43, 0x0a},
  {0x44, 0xf0},
  {0x45, 0x46},
  {0x46, 0x62},
  {0x47, 0x2a},
  {0x48, 0x3c},
  {0x4a, 0xfc},
  {0x4b, 0xfc},
  {0x4c, 0x7f},
  {0x4d, 0x7f},
  {0x4e, 0x7f},
  {0x4f, 0x98}, //98
  {0x50, 0x98}, //98
  {0x51, 0x00}, //00
  {0x52, 0x28}, //28
  {0x53, 0x88}, //70
  {0x54, 0xb0}, //98
  {0x58, 0x1a}, 
  {0x59, 0x85},
  {0x5a, 0xa9},
  {0x5b, 0x64},
  {0x5c, 0x84},
  {0x5d, 0x53},
  {0x5e, 0x0e},
  {0x5f, 0xf0},
  {0x60, 0xf0},
  {0x61, 0xf0},
  {0x62, 0x00},
  {0x63, 0x00},
  {0x64, 0x02},
  {0x65, 0x20},
  {0x66, 0x00},
  {0x69, 0x0a},
  {0x6b, 0x4a},//这个可以分频PLL 8a
  {0x6c, 0x04},
  {0x6d, 0x55},
  {0x6e, 0x00},
  {0x6f, 0x9d},
  {0x70, 0x21},
  {0x71, 0x78},
  {0x72, 0x11},
  {0x73, 0x01},
  {0x74, 0x10},
  {0x75, 0x10},
  {0x76, 0x01},
  {0x77, 0x02},
  {0x7A, 0x12},
  {0x7B, 0x08},
  {0x7C, 0x16},
  {0x7D, 0x30},
  {0x7E, 0x5e},
  {0x7F, 0x72},
  {0x80, 0x82},
  {0x81, 0x8e},
  {0x82, 0x9a},
  {0x83, 0xa4},
  {0x84, 0xac},
  {0x85, 0xb8},
  {0x86, 0xc3},
  {0x87, 0xd6},
  {0x88, 0xe6},
  {0x89, 0xf2},
  {0x8a, 0x24},
  {0x8c, 0x80},
  {0x90, 0x7d},
  {0x91, 0x7b},
  {0x9d, 0x02},//03
  {0x9e, 0x02},//04
  {0x9f, 0x7a},
  {0xa0, 0x79},
  {0xa1, 0x40},//更改曝光时间 40
  {0xa4, 0x50},
  {0xa5, 0x68},
  {0xa6, 0x4a},
  {0xa8, 0xc1},
  {0xa9, 0xef},
  {0xaa, 0x92},
  {0xab, 0x04},
  {0xac, 0x80},
  {0xad, 0x80},
  {0xae, 0x80},
  {0xaf, 0x80},
  {0xb2, 0xf2},
  {0xb3, 0x20},
  {0xb4, 0x20},
  {0xb5, 0x00},
  {0xb6, 0xaf},
  {0xbb, 0xae},
  {0xbc, 0x7f},
  {0xbd, 0x7f},
  {0xbe, 0x7f},
  {0xbf, 0x7f},
  {0xc0, 0xaa},
  {0xc1, 0xc0},
  {0xc2, 0x01},
  {0xc3, 0x4e},
  {0xc6, 0x05},
  {0xc7, 0x81},
  {0xc9, 0xe0},
  {0xca, 0xe8},
  {0xcb, 0xf0},
  {0xcc, 0xd8},
  {0xcd, 0x93},
};


/* 初始化ov9655摄像头 */
int ov9655_init(void)
{
    //dvp_cam_init();
    

    //uint16_t v_manuf_id;
    //uint16_t v_device_id;

    //ov9655_read_id(&v_manuf_id, &v_device_id);
    //printf("manuf_id:0x%04x,device_id:0x%04x\n", v_manuf_id, v_device_id); 

    uint16_t index = 0;
    uint8_t reg = 0;
    for (index = 0; index<LEN; index++)
    {
        dvp_sccb_send_data(OV9655_ADDR, ov9655_config[index][0], ov9655_config[index][1]);
    }
    dvp_cam_set_irq();
    return 0;
}


/* 读取ov9655的地址 */
int ov9655_read_id(uint16_t *manuf_id, uint16_t *device_id)
{
    //dvp_sccb_send_data(OV9655_ADDR,OV9655_COM7,SCCB_REG_RESET);//清空寄存器的值

    *manuf_id = (dvp_sccb_receive_data(OV9655_ADDR, 0x1C) << 8) | dvp_sccb_receive_data(OV9655_ADDR, 0x1D); //读制造商标识符
    *device_id = (dvp_sccb_receive_data(OV9655_ADDR, 0x0A) << 8) | dvp_sccb_receive_data(OV9655_ADDR, 0x0B); //读PID和VER
    return 0;
}
